/*.
 */

package Dblayer;

import Modellayer.*;
import java.sql.*;
import java.util.ArrayList;
/**
 *
 * @author Michael
 */
public class DBLoen implements IFDBLoen
{

	private Connection con;

	public DBLoen()
	{
	con = DBConnection.getInstance().getDBcon();
	}

	public ArrayList<Loen> hentLoen(boolean retrieveAssociation)
    {
        return miscWhere("", retrieveAssociation);
    }

	public ArrayList<Loen> findLoenMedMedNr(int medNr, boolean retrieveAssociation)
	{
		String wClause = " medNr = '" + medNr + "'";
		return miscWhere(wClause, retrieveAssociation);
	}

	public Loen findLoen(int medNr, boolean retrieveAssociation)
    {
        String wClause = "  medNr = '" + medNr + "'";
        return singleWhere(wClause, retrieveAssociation);
    }

	public int opretLoen(Loen loen)
	{
	int rc = -1;
    String query="INSERT INTO semLoen(loenID, fraDato, tilDato, samlettimer, samletloen, medNr)  VALUES('"+
	  		loen.getLoenID()  + "','"  +
			loen.getFraDato() + "','" +
			loen.getTilDato() + "','" +
			loen.getSamletTimer() + "','" +
			loen.getSamletLoen() + "','" +
			loen.getMedNr().getMedNr() + "')";

      System.out.println("insert : " + query);
      try{ //indsæt ny loen
            Statement stmt = con.createStatement();
	 	  	stmt.setQueryTimeout(5);
	 	  	rc = stmt.executeUpdate(query);
	 	  	stmt.close();
		}//slut try
	 	catch(Exception ex){
	 	  	System.out.println("Insert exception in semLoen db: "+ex);
	   }
	   return(rc);
	}

	public void sletLoen(int id)
	{
               int rc=-1;

	  	String query="DELETE FROM semLoen WHERE loenID = '" +
				id + "'";
                System.out.println(query);
	  	try{ //slet fra semLoen
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 	  	rc = stmt.executeUpdate(query);
	 	  	stmt.close();
  		}//slut try
   	        catch(Exception ex){
	 	  	System.out.println("Delete exception in semLoen db: "+ex);
   	        }
	}

	public int redigerLoen(Loen loen)
	{
		Loen loenObj  = loen;
		int rc=-1;

		String query="UPDATE semLoen SET "+
                        "loenID ='" + loenObj.getLoenID() + "', " +
		    	"fraDato ='" + loenObj.getFraDato() + "', " +
                        "tilDato ='" + loenObj.getTilDato() + "', " +
                        "samlettimer ='" + loenObj.getSamletTimer() + "', " +
						"samletloen ='" + loenObj.getSamletLoen() + "', " +
						"arbID ='" + loenObj.getMedNr().getMedNr() + "'" +
		        " WHERE loenID = '"+ loenObj.getLoenID() + "'";

                System.out.println("Update query:" + query);
  		try{ //opdater loen
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 	 	rc = stmt.executeUpdate(query);

	 	 	stmt.close();
		}//slut try
	 	catch(Exception ex){
	 	 	System.out.println("Update exception in loen db: "+ex);
	  	}
		return(rc);
    }

	private ArrayList<Loen> miscWhere(String wClause, boolean retrieveAssociation)
	{
            ResultSet results;
	    ArrayList<Loen> list = new ArrayList<Loen>();

	    String query =  buildQuery(wClause);

            try{ //læs semLoen fra databasen
		Statement stmt = con.createStatement();
	 	stmt.setQueryTimeout(5);
	 	results = stmt.executeQuery(query);

		int snr=0;
		while( results.next() ){
	     	 Loen loenObj = new Loen();
		 loenObj = buildLoen(results);
                 list.add(loenObj);
		}//slut while
                 stmt.close();
                 if(retrieveAssociation)
                 {   //assosiationen bliver også bygget
                     for(Loen loenObj : list){
						IFDBMedarbejder dbMedarbejderObj = new DBMedarbejder();
                        Medarbejder medarbejderObj = dbMedarbejderObj.findMedarbejder(loenObj.getMedNr().getMedNr());
                        System.out.println("medarbejder is seleceted ");
						loenObj.setMedNr(medarbejderObj);
                     }
                 }//slut if

		}//slut try
	 	catch(Exception e){
	 		System.out.println("Query exception - select: "+e);
			e.printStackTrace();
	 	}
		return list;
	}

	//Singelwhere bliver brugt hvis der kun er 1 ting der skal findes
	private Loen singleWhere(String wClause, boolean retrieveAssociation)
	{
		ResultSet results;
		Loen loenObj = new Loen();

	        String query =  buildQuery(wClause);
                System.out.println(query);
		try{ //læs semLoen fra databasen
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 		results = stmt.executeQuery(query);

	 		if( results.next() ){
                            loenObj = buildLoen(results);
                            //assocaitionen bliver også bygget
                            stmt.close();
                            if(retrieveAssociation)
                            { 
								IFDBMedarbejder dbMedarbejderObj = new DBMedarbejder();
								Medarbejder medarbejderObj = dbMedarbejderObj.findMedarbejder(loenObj.getMedNr().getMedNr());
								System.out.println("medarbejder is seleceted ");
								loenObj.setMedNr(medarbejderObj);
                            }
			}
                        else{ //ingen Loen blev fundet
                            loenObj = null;
                        }
		}//slut try
	 	catch(Exception e){
	 		System.out.println("Query exception: "+e);
	 	}
		return loenObj;
	}
	//metoden der bygger en "query"
	private String buildQuery(String wClause)
	{
	    String query="SELECT loenID, fraDato, tilDato, samlettimer, samletloen, arbID FROM semLoen";

		if (wClause.length()>0)
			query=query+" WHERE "+ wClause;

		return query;
	}

	private Loen buildLoen(ResultSet results)
      {   Loen loenObj = new Loen();
		  IFDBMedarbejder dbMedarbejderObj = new DBMedarbejder();
          try{ //de tables der bliver brugt er fra semLoen
                loenObj.setLoenID(results.getInt("loenID"));
                loenObj.setFraDato(results.getString("fraDato"));
				loenObj.setTilDato(results.getString("tilDato"));
				loenObj.setSamletTimer((results.getInt("samlettimer")));
				loenObj.setSamletLoen((results.getDouble("samlettimer")));
                loenObj.setMedNr(dbMedarbejderObj.findMedarbejder(results.getInt("medNr")));
          }
         catch(Exception e)
         {
             System.out.println("error in building the loen object");
         }
         return loenObj;
      }
}
